package engine

import (
	"fmt"
)

type SimpleEngine struct{}

func (SimpleEngine) Run(seeds ...Request) {
	//q := []Request{}
	q := queue{}
	for _, r := range seeds {
		q.push(r)
	}

	itemCount := 0
	for len(q) > 0 {
		r := q.pop()

		ps, e := Worker(r)
		if e != nil {
			continue
		}

		q.push(ps.Requests...)
		for _, item := range ps.Items {
			fmt.Printf("Got item #%d, %v\n", itemCount, item)
			itemCount++
		}
	}
}

// 单任务版爬虫的原理：
// 客户端传入URL， 将URL放入任务队列
// 从任务队列pop队首URL，然后调用fetcher请求网页然后解析网页内容
// 将下一级URL入队
// 从上面的执行过程中可以看出 制约速度的是请求网页并解析
// 每次从任务队列出队后要等待这一次网页请求执行完毕后才会进行下一个出队
// 因此可以将这部分作为多个goroutine并发运行

// 任务队列
type queue []Request

func (q *queue) push(r ...Request) {
	*q = append(*q, r...)
}

func (q *queue) pop() Request {
	head := (*q)[0]
	*q = (*q)[1:]

	return head
}

func (q *queue) isEmpty() bool {
	return len(*q) == 0
}
